package br.com.sovi.resources.usuario;

import static org.junit.Assert.assertEquals;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.MediaType;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.easymock.EasyMock;
import org.junit.Test;
import org.openinsula.vulcano.core.command.invoker.CommandInvoker;
import org.springframework.mock.web.MockHttpServletResponse;

import br.com.sovi.persistence.Empresa;
import br.com.sovi.persistence.Usuario;
import br.com.sovi.resources.AbstractMockJerseyTestCase;
import br.com.sovi.resources.RequestMockHttpServletBuilder;

public class UsuarioResourceTestCase extends AbstractMockJerseyTestCase {

	@Test
	public void testGetAllNenhumUsuarioEncontrado() throws UnsupportedEncodingException, JSONException {
		List<Usuario> usuarios = new ArrayList<Usuario>();

		final CommandInvoker commandInvoker = EasyMock.createStrictMock(CommandInvoker.class);
		EasyMock.expect(commandInvoker.invoke((GetUsuarioByCnpjEmpresaCommand) EasyMock.anyObject())).andReturn(
				usuarios);
		EasyMock.replay(commandInvoker);

		UsuarioResource resource = getBean("usuarioResource");
		resource.setCommandInvoker(commandInvoker);

		final MockHttpServletResponse response = new RequestMockHttpServletBuilder(servletContext,
				br.com.sovi.resources.HttpMethod.GET, "/usuario/allFromEmpresa").contentType(
				MediaType.APPLICATION_FORM_URLENCODED).addParameter("cnpjEmpresa", "123").buildResponse(dispatcher);

		assertEquals(200, response.getStatus());
		assertEquals("null",
				response.getContentAsString());
	}

	@Test
	public void testGetAll() throws UnsupportedEncodingException, JSONException {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		usuarios.add(createUsuario("Joao", "realm", "sovi"));
		usuarios.add(createUsuario("Marcos", "alex", "sovi"));

		final CommandInvoker commandInvoker = EasyMock.createStrictMock(CommandInvoker.class);
		EasyMock.expect(commandInvoker.invoke((GetUsuarioByCnpjEmpresaCommand) EasyMock.anyObject())).andReturn(
				usuarios);
		EasyMock.replay(commandInvoker);

		UsuarioResource resource = getBean("usuarioResource");
		resource.setCommandInvoker(commandInvoker);

		final MockHttpServletResponse response = new RequestMockHttpServletBuilder(servletContext,
				br.com.sovi.resources.HttpMethod.GET, "/usuario/allFromEmpresa").contentType(
				MediaType.APPLICATION_FORM_URLENCODED).addParameter("cnpjEmpresa", "123").buildResponse(dispatcher);

		assertEquals(200, response.getStatus());
		assertEquals("[{\"nome\":\"Joao\",\"login\":\"realm\"},{\"nome\":\"Marcos\",\"login\":\"alex\"}]",
				new JSONObject(response.getContentAsString()).get("usuario").toString());
	}

	private Usuario createUsuario(String nome, String login, String descEmpresa) {
		Usuario usuario = new Usuario(nome, login);

		Empresa empresa = new Empresa();
		empresa.setDescricao(descEmpresa);

		usuario.setEmpresa(empresa);

		return usuario;
	}

	// public static void main(String[] args) {
	// Client client = Client.create();
	// WebResource resource = client
	// .resource("http://localhost:8080/sovi-server/rest/usuario/autenticacao?login=joao&senha=asd");
	//
	// String string =
	// resource.type(MediaType.APPLICATION_JSON).post(String.class);
	// System.out.println(string);
	//
	// JSONObject jso = resource.type(MediaType.APPLICATION_JSON).post(new
	// GenericType<JSONObject>() {
	// });
	//
	// try {
	// System.out.println(jso.get("result"));
	// }
	// catch (JSONException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// }

}
